﻿using System;

namespace Nomo.CoreModule
{
    /// <summary>
    /// 日志记录工具类。
    /// </summary>
    public static class Log
    {
        /// <summary>
        /// 是否允许记录提示日志？
        /// </summary>
        public static bool AllowInfo { get; set; } = true;

        /// <summary>
        /// 是否允许记录警告日志？
        /// </summary>
        public static bool AllowWarning { get; set; } = true;

        /// <summary>
        /// 是否允许记录错误日志？
        /// </summary>
        public static bool AllowError { get; set; } = true;

        private static ILogger _logger;

        /// <summary>
        /// 在记录提示日志时。
        /// </summary>
        public static event Action<object> LoggedInfo;

        /// <summary>
        /// 在记录警告日志时。
        /// </summary>
        public static event Action<object> LoggedWarning;

        /// <summary>
        /// 在记录错误日志时。
        /// </summary>
        public static event Action<object> LoggedError;

        /// <summary>
        /// 日志记录器。
        /// </summary>
        public static ILogger Logger { get => _logger ?? (_logger = new ConsoleLogger()); set => _logger = value; }

        /// <summary>
        /// 记录提示日志。
        /// </summary>
        /// <param name="message">信息。</param>
        public static void Info(object message)
        {
            if (AllowInfo)
            {
                LoggedInfo?.Invoke(message);
                _logger?.Info(message);
            }
        }

        /// <summary>
        /// 记录警告日志。
        /// </summary>
        /// <param name="message">信息。</param>
        public static void Warning(object message)
        {
            if (AllowWarning)
            {
                LoggedWarning?.Invoke(message);
                _logger?.Warning(message);
            }
        }

        /// <summary>
        /// 记录错误日志。
        /// </summary>
        /// <param name="message">信息。</param>
        public static void Error(object message)
        {
            if (AllowError)
            {
                LoggedError?.Invoke(message);
                _logger?.Error(message);
            }
        }
    }
}
